﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VRacer.Packets;
using System.Windows.Threading;
using VRacer.Connection;

namespace VRacer
{
    /// <summary>
    /// Rozszerza gre o wlasciwosci potrzebne w grze sieciowej. Nakazuje klasom potomnym implementacje metody Send slużącej do wysyłania pakietów.
    /// Dostarcze także obiekt Dispatchera który jest czasem potrzebny przy modyfikacji ObservableCollection podbindowanej do interfejsu.
    /// Przechowuje także listę graczy w postaci tablicy hashowanej po ID gracza (PlayersByID).
    /// </summary>
    public abstract class NetGame<TConnection, TNativePlayer> : Game where TConnection : ConnectionBase where TNativePlayer : PlayerBase
    {
        private Dictionary<int, TNativePlayer> _playersByID = new Dictionary<int, TNativePlayer>(13);
        
        private int _port = 666;
        private Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;

        protected Dispatcher Dispatcher
        {
            get { return _dispatcher; }
        }

        private TConnection _connection;

        public TConnection Connection
        {
            get { return _connection; }
            protected set { _connection = value; }
        }

        /// <summary>
        /// Zawodnicy w grze po ID
        /// </summary>
        /// <value>The players by ID.</value>
        protected Dictionary<int, TNativePlayer> PlayersByID
        {
            get { return _playersByID; }
        }

        /// <summary>
        /// Port na ktorym nalezy nasluchiwac lub z ktorym sie laczyc
        /// </summary>
        /// <value>The port.</value>
        public int Port
        {
            get { return _port; }
            set { _port = value; }
        }

        /// <summary>
        /// Wysyla pakiet
        /// </summary>
        /// <param name="packet">The packet.</param>
        public abstract void Send(PacketBase packet);
    }
}
